#region Copyright and Licensing Notice
// Copyright (C) 2011 Steven Bosnick
// 
// This program is open source software; you can redistribute it 
// and/or modifiy it under the terms of the Eclipse Public License,
// version 1.0.
// 
// This program is distributed in the hope that it will be useful, 
// but WITHOUT ANY WARRANTY; without even the implied
// warranty of MERCHANTABILITY or FITNESS FOR A 
// PARTICULAR PURPOSE. See the Eclipse Public License for more
// details.
// 
// You should have received a copy of the Eclipse Public License 
// along with this program; if not, you can find a copy at
// "http://www.opensource.org/licenses/eclipse-1.0.php".
#endregion
using System;
using System.Threading.Tasks;
using BitwiseOre.SharedMemory.Core;

namespace BitwiseOre.SharedMemory.Utils
{
    internal static class TaskExtentions
    {
        public static Task<T> WithAsyncCallback<T>(this Task<T> task, AsyncCallback callback, object state)
        {
            var source = new TaskCompletionSource<T>(state);

            task.ContinueWith(
                (Action<Task<T>>) (t =>
                              {
                                  source.TrySetFromTask(t, () => t.Result);
                                  if (callback != null) callback(source.Task);
                              }));

            return source.Task;
        }

        public static Task WithAsyncCallback(this Task task, AsyncCallback callback, object state)
        {
            var source = new TaskCompletionSource<object>(state);

            task.ContinueWith(
                t =>
                    {
                        source.TrySetFromTask(t, () => null);
                        if (callback != null) callback(source.Task);
                    });

            return source.Task;
        }
    }
}